package controller;

import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Set;

import model.Cliente;
import dao.ClienteDAO;

/**
 * Classe para interagir com comandos via teclado do cliente e montar objetos
 * par serem usados por outras classes.
 * 
 * @author Pedro Candido
 * @since 29/04/12
 */
public class ClienteController {
	/**
	 * Instancia estatica de scanner, para nao ter que instancia-la a todo o
	 * momento
	 */
	private static Scanner sc = new Scanner(System.in);

	/**
	 * Pedir para usuario inserir um cpf via teclado.
	 * 
	 * @return String
	 */
	public static String askCpf() {
		System.out.println("Insira o cpf do cliente:");

		try {
			return sc.nextLine();
		} catch (InputMismatchException e) {
			System.err.println("Valor inserido invalido. Insira novamente");

			// Usando phoenix exception para resolver esse problema.
			return ClienteController.askCpf();
		}
	}

	public static Cliente escolherCliente(HashMap<String, Cliente> clienteList) {
		return ClienteDAO.loadByCpf(clienteList, ClienteController.askCpf());
	}

	/**
	 * Metodo para pegar informacoes de um novo cliente para cadastrar.
	 * 
	 * @return Cliente cliente
	 */
	public static Cliente toInclude() {

		Cliente cliente = new Cliente();
		try {

			System.out.println("CPF:");
			cliente.setCpf(sc.nextLine());

			System.out.println("Nome:");
			cliente.setNome(sc.nextLine());

			System.out.println("Endereco:");
			cliente.setEndereco(sc.nextLine());

			System.out.println("Telefone:");
			cliente.setTelefone(sc.nextLine());

			return cliente;
		} catch (InputMismatchException e) {
			System.err.println("Valor inserido invalido. Tente novamente");

			// Usando phoenix exception para resolver esse problema.
			return ClienteController.toInclude();
		}
	}

	/**
	 * Metodo para pegar informacoes para alterar um cliente.
	 * 
	 * @param Cliente
	 *            cliente
	 * @return Cliente cliente
	 */
	public static Cliente toUpdate(Cliente cliente) {
		System.out.println("Cliente atual: ");
		cliente.imprimir(false);
		do{
			try{
				System.out.println("Alterar nome? (S/N)");
				String entrada = sc.nextLine();
				if (entrada.equalsIgnoreCase("s")) {
					System.out.println("Digite o novo nome:");
					entrada = sc.nextLine();
					cliente.setNome(entrada);
					break;
				}
				else if (entrada.equalsIgnoreCase("n")){
					break;
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		}while(true);
		
		do{
			try{
				System.out.println("Alterar endereco? (S/N)");
				String entrada = sc.nextLine();
				if (entrada.equalsIgnoreCase("s")) {
					System.out.println("Digite o novo endereco:");
					entrada = sc.nextLine();
					cliente.setEndereco(entrada);
					break;
				}
				else if (entrada.equalsIgnoreCase("n")){
					break;
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		}while(true);
		
		do{
			try{
				System.out.println("Alterar telefone? (S/N)");
				String entrada = sc.nextLine();
				if (entrada.equalsIgnoreCase("s")) {
					System.out.println("Digite o novo telefone:");
					entrada = sc.nextLine();
					cliente.setTelefone(entrada);
					break;
				}
				else if (entrada.equalsIgnoreCase("n")){
					break;
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		}while(true);
		
		return cliente;
	}

	/**
	 * Metodo para pegar cliente a ser deletado.
	 * 
	 * @return Cliente cliente
	 */
	public static Cliente toDelete(HashMap<String, Cliente> clienteList) {
		sc = new Scanner(System.in);
		String cpf = ClienteController.askCpf();
		Cliente cliente = ClienteDAO.loadByCpf(clienteList, cpf);
		if (cliente != null) {
			System.out.println("Tem certeza que deseja excluir o cliente abaixo? (S/N)");
			cliente.imprimir(false);
			do{
				try{
					String entrada = sc.nextLine();
					if(entrada.equalsIgnoreCase("n")) {
						cliente = null; // zera cliente a ser retornado para que nao seja apagado.
						break;
					}
					if(entrada.equalsIgnoreCase("s")) {
						System.out.println(ClienteDAO.getMsg());
						break;
					}
				} catch (InputMismatchException e) {
					System.err.println("Valor invalido: \nDigite um valor valido");
					sc.nextLine();
				}
			}while(true);
		}else{
			System.err.println("Cliente inexistente.");
		}
		return cliente;
	}

	/**
	 * Imprimir todos os clientes na lista passada.
	 * 
	 * @param HashMap
	 *            <String, Cliente> clientList
	 */
	public static void imprimir(HashMap<String, Cliente> clientList) {
		Set<String> clienteKeys = clientList.keySet();

		Cliente cliente;
		System.out.println("");
		System.out
		.println("_____________________________________________________________________________");

		for (String key : clienteKeys) {
			cliente = clientList.get(key);

			System.out.println("Nome: " + cliente.getNome());
			System.out.println("CPF: " + cliente.getCpf());
			System.out.println("Endereco: " + cliente.getEndereco());
			System.out.println("Telefone: " + cliente.getTelefone());
			System.out.println("Numero de pedidos feitos:"
					+ cliente.getPedidoList().size());
			System.out
					.println("_____________________________________________________________________________");
			System.out.println("");
		}

	}
}
